package asm;

import jdk.internal.org.objectweb.asm.Type;

/**
 * Created by zhangyanfei on 2018/10/17.
 *
 * @author zhangyanfei
 * @date 2018/10/17
 */
public class AsmDemo {
    public static void main(String[] args) throws NoSuchMethodException {
        /**
         *         java 二进制文件中的 各种描述
         */

        //1.类全名描述
        System.out.println(Type.getInternalName(String.class));
        //2.数据类型描述
        System.out.println(Type.getDescriptor(String.class));
        //3.方法描述 （入参类型）返回参数类型
        System.out.println(Type.getMethodDescriptor(String.class.getMethod("substring", int.class)));
        //4.ClassVisitor visit 构造方法 visitField  visitMethod
        //5.ClassReader  它的accept方法，接受一个具体的ClassVisitor，并调用实现中具体的visit
        //6.ClassWriter  这个类是ClassVisitor的一个实现类，这个类中的toByteArray方法会将最终修改的字节码以byte数组形式返回
        //7.ClassAdapter 这个类也是ClassVisitor的一个实现类，这个类可以看成是一个事件过滤器，在这个类里，它对ClassVisitor的实现都是委派给一个具体的ClassVisitor实现类，即调用那个实现类实现的方法。
        // 一般情况下，我们需要操作一个类时，首先是获得其二进制的字节码，即用ClassReader来读取一个类，然后需要一个能将二进制字节码写回的类，即用ClassWriter类，最后就是一个事件过滤器，即ClassAdapter。事件过滤器中的某些方法可以产生一个新的XXXVisitor对象，
        // 当我们需要修改对应的内容时只要实现自己的XXXVisitor并返回就可以了。
    }
}
